package modelo.persistencia.JDBC;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import modelo.entidades.Parking;
import modelo.entidades.ParkingImp;
import modelo.persistencia.ParkingDAO;

/**
 *
 * @author jjcamacho
 */
public class ParkingDAOJDBC implements ParkingDAO {

    @Override
    public Parking read(String pk) throws SQLException, Exception {
        Parking parking = null;
        String sql = "select * from parkings where nombre = ?";
        try {
            PreparedStatement stmt = Persistencia.createConnection().prepareStatement(sql);
            stmt.setString(1, pk);
            ResultSet res = stmt.executeQuery();
            if (res.next()) {
                String nombre = res.getString("nombre");
                String grupo = res.getString("grupo");
                int plazas = res.getInt("plazas");
                int plazasLibres = res.getInt("plazas_libres");
                String variable = res.getString("variable");
                parking = new ParkingImp(nombre);
                parking.setGrupo(grupo);
                parking.setPlazas(plazas);
                parking.setPlazasLibres(plazasLibres);
                parking.setVariable(variable);
            }
        } finally {
            Persistencia.closeConnection();
        }
        return parking;
    }

    @Override
    public Parking read(Parking entidad) throws SQLException, Exception {
        throw new UnsupportedOperationException("No implementado");
    }

    @Override
    public void create(Parking parking) throws SQLException, Exception {
        String sql = "insert into parkings(nombre, grupo, plazas, variable, plazas_libres) values (?,?,?,?,?)";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, parking.getNombre());
            stm.setString(2, parking.getGrupo());
            stm.setInt(3, parking.getPlazas());
            stm.setString(4, parking.getVariable());
            stm.setInt(5, parking.getPlazasLibres());
            stm.execute();
        } finally {
            Persistencia.closeConnection();
        }
    }

    @Override
    public void update(Parking parking) throws SQLException, Exception {
        String sql = "update parkings set nombre=?, grupo=?, plazas=?, plazas_libres=?, variable=? where nombre like ?";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, parking.getNombre());
            stm.setString(2, parking.getGrupo());
            stm.setInt(3, parking.getPlazas());
            stm.setInt(4, parking.getPlazasLibres());
            stm.setString(5, parking.getVariable());
            stm.setString(6, parking.getNombre());

            stm.executeUpdate();
        } finally {
            Persistencia.closeConnection();
        }
    }

    @Override
    public void delete(Parking parking) throws SQLException, Exception {
        String sql = "delete from parkings where nombre = ?";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, parking.getNombre());
            stm.execute();
        } finally {
            Persistencia.closeConnection();
        }
    }

    @Override
    public List<Parking> list() throws SQLException, Exception {
        List<Parking> parkings = new ArrayList<Parking>();

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("select * from parkings");
            while (res.next()) {
                String nombre = res.getString("nombre");
                String grupo = res.getString("grupo");
                Integer plazas = res.getInt("plazas");
                Integer plazasLibres = res.getInt("plazas_libres");
                String variable = res.getString("variable");
                Parking parking = new ParkingImp(nombre);
                parking.setGrupo(grupo);
                parking.setPlazas(plazas);
                parking.setPlazasLibres(plazasLibres);
                parking.setVariable(variable);
                parkings.add(parking);
            }
        } finally {
            Persistencia.closeConnection();
        }
        return parkings;
    }
}
